package com.bjxthomework;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**复制目录文件
 * 考虑到文件可能是图片，影音，不只是文本，
  所以用FileInputStream和FileOutputStream
 * 自定义缓冲byte数组*/
public class CopyDirectoryFile {
    public static void main(String[] args) {
        //因为方法中的参数是File类，所以要new File(" ")
            copyDirector(new File("d:/oop"),new File("d:/oop1"));
    }


    public static void copyDirector(File source,File dir){
        if(!source.exists()){
            System.out.println("源文件"+source+"不存在，不可以复制");
            return;
        }
        //如果源文件是文件,直接调用复制文件方法
        if(!source.isDirectory()){
            copyFile(source,dir);
        }else { //如果是目录
            if (!dir.exists())
                dir.mkdir();
            //获取源文件的第一层所有文件
            File[] files = source.listFiles();
            for (int i = 0; i < files.length; i++) {
                //如果是目录。则调用自己方法
                if (files[i].isDirectory()) {
                    copyDirector(new File(source + "//" + files[i].getName()), new File(dir + "//" + files[i].getName()));
                } else { //不是目录，则是文件 调用复制文件方法
                    copyFile(new File(source + "//" + files[i].getName()), new File(dir + "//" + files[i].getName()));
                }
            }
        }
    }

    public static void copyFile(File src,File des){
        if(!src.canRead()){
            System.out.println("源文件"+src+"不可读，无法复制");
            return;
        }else {
            //定义流
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try{
                //创建对象
                fis = new FileInputStream(src);
                fos = new FileOutputStream(des);
                byte[] arr = new byte[1024]; //定义数组缓存
                int temp = 0;
                //注意优先级
                while ((temp = fis.read(arr)) != -1){
                    fos.write(arr,0,temp);
                }
                fos.flush();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                try {
                    //关闭流
                    if (fos != null) {
                        fos.close();
                    }
                    if (fis != null) {

                        fis.close();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }


        }

    }
}